package com.chhuang.ewcrm.service.impl;

import com.chhuang.ewcrm.dao.EMaxNumberDao;
import com.chhuang.ewcrm.dao.SysConfigDao;
import com.chhuang.ewcrm.date.DateUtil;
import com.chhuang.ewcrm.entity.EMaxNumber;
import com.chhuang.ewcrm.entity.SysConfig;
import com.chhuang.ewcrm.service.EMaxNumberService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * (EMaxNumber)表服务实现类
 *
 * @author chhuang
 * @since 2020-11-14 10:00:34
 */
@Service("eMaxNumberService")
public class EMaxNumberServiceImpl implements EMaxNumberService {
    @Resource
    private EMaxNumberDao eMaxNumberDao;

    /**
     * 通过ID查询单条数据
     *
     * @param numberId 主键
     * @return 实例对象
     */
    @Override
    public EMaxNumber queryById(String numberId) {
        return this.eMaxNumberDao.queryById(numberId);
    }

    /**
     * 通过多个ID查询多条数据
     *
     * @param list<EMaxNumber> 主键列表
     * @return 对象列表
     */
    @Override
    public List<EMaxNumber> queryByIds(List<String> list) {
        return this.eMaxNumberDao.queryByIds(list);
    }

    /**
     * 通过实体作为筛选条件查询
     *
     * @param eMaxNumber 实例对象
     * @return 对象列表
     */
    @Override
    public List<EMaxNumber> query(EMaxNumber eMaxNumber) {
        return this.eMaxNumberDao.query(eMaxNumber);
    }

    /**
     * 通过实体作为筛选条件查询,支持排序
     *
     * @param eMaxNumber 实例对象
     * @return 对象列表
     */
    @Override
    public List<EMaxNumber> query(EMaxNumber eMaxNumber, String orderBy) {
        PageHelper.orderBy(orderBy);
        return this.eMaxNumberDao.query(eMaxNumber);
    }

    /**
     * 通过实体作为筛选条件查询,支持分页
     *
     * @param eMaxNumber 实例对象
     * @return pageInfo对象
     */
    @Override
    public PageInfo<EMaxNumber> query(EMaxNumber eMaxNumber, Integer pageNum, Integer pageSize) {
        return PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() ->
                this.eMaxNumberDao.query(eMaxNumber)
        );
    }

    /**
     * 通过实体作为筛选条件查询,支持分页和排序
     *
     * @param eMaxNumber 实例对象
     * @return pageInfo对象
     */
    @Override
    public PageInfo<EMaxNumber> query(EMaxNumber eMaxNumber, Integer pageNum, Integer pageSize, String orderBy) {
        return PageHelper.startPage(pageNum, pageSize, orderBy).doSelectPageInfo(() ->
                this.eMaxNumberDao.query(eMaxNumber)
        );
    }

    /**
     * 通过实体作为筛选条件模糊查询
     *
     * @param eMaxNumber 实例对象
     * @return 对象列表
     */
    @Override
    public List<EMaxNumber> queryLike(EMaxNumber eMaxNumber) {
        return this.eMaxNumberDao.queryLike(eMaxNumber);
    }

    /**
     * 通过实体作为筛选条件模糊查询,支持排序
     *
     * @param eMaxNumber 实例对象
     * @return 对象列表
     */
    @Override
    public List<EMaxNumber> queryLike(EMaxNumber eMaxNumber, String orderBy) {
        PageHelper.orderBy(orderBy);
        return this.eMaxNumberDao.queryLike(eMaxNumber);
    }

    /**
     * 通过实体作为筛选条件模糊查询,支持分页
     *
     * @param eMaxNumber 实例对象
     * @return pageInfo对象
     */
    @Override
    public PageInfo<EMaxNumber> queryLike(EMaxNumber eMaxNumber, Integer pageNum, Integer pageSize) {
        return PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() ->
                this.eMaxNumberDao.queryLike(eMaxNumber)
        );
    }

    /**
     * 通过实体作为筛选条件模糊查询,支持分页和排序
     *
     * @param eMaxNumber 实例对象
     * @return pageInfo对象
     */
    @Override
    public PageInfo<EMaxNumber> queryLike(EMaxNumber eMaxNumber, Integer pageNum, Integer pageSize, String orderBy) {
        return PageHelper.startPage(pageNum, pageSize, orderBy).doSelectPageInfo(() ->
                this.eMaxNumberDao.queryLike(eMaxNumber)
        );
    }

    /**
     * 通过字符串全属性模糊查询
     *
     * @param key 要查找的字符串
     * @return 对象列表
     */
    @Override
    public List<EMaxNumber> search(String key) {
        return this.eMaxNumberDao.search(key);
    }

    /**
     * 通过字符串全属性模糊查询,支持排序
     *
     * @param key 要查找的字符串
     * @return 对象列表
     */
    @Override
    public List<EMaxNumber> search(String key, String orderBy) {
        PageHelper.orderBy(orderBy);
        return this.eMaxNumberDao.search(key);
    }

    /**
     * 通过字符串全属性模糊查询,支持分页
     *
     * @param key 要查找的字符串
     * @return PageInfo对象
     */
    @Override
    public PageInfo<EMaxNumber> search(String key, Integer pageNum, Integer pageSize) {
        return PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() ->
                this.eMaxNumberDao.search(key)
        );
    }

    /**
     * 通过字符串全属性模糊查询,支持分页和排序
     *
     * @param key 要查找的字符串
     * @return PageInfo对象
     */
    @Override
    public PageInfo<EMaxNumber> search(String key, Integer pageNum, Integer pageSize, String orderBy) {
        return PageHelper.startPage(pageNum, pageSize, orderBy).doSelectPageInfo(() ->
                this.eMaxNumberDao.search(key)
        );
    }

    /**
     * 新增数据
     *
     * @param eMaxNumber 实例对象
     * @return 实例对象
     */
    @Override
    public EMaxNumber insert(EMaxNumber eMaxNumber) {
        this.eMaxNumberDao.insert(eMaxNumber);
        return eMaxNumber;
    }

    /**
     * 新增多条数据
     *
     * @param list<EMaxNumber> 对象列表
     * @return 影响行数
     */
    @Override
    public int insertBatch(List<EMaxNumber> list) {
        return list != null && !list.isEmpty() ? this.eMaxNumberDao.insertBatch(list) : 0;
    }

    /**
     * 修改数据
     *
     * @param eMaxNumber 实例对象
     * @return 实例对象
     */
    @Override
    public EMaxNumber update(EMaxNumber eMaxNumber) {
        this.eMaxNumberDao.update(eMaxNumber);
        return this.queryById(eMaxNumber.getNumberId());
    }

    /**
     * 通过表字段修改实体属性不为null的列
     *
     * @param where 条件实例对象
     * @param set   修改实例对象
     * @return 影响行数
     */
    @Override
    public int updateByField(EMaxNumber where, EMaxNumber set) {
        return this.eMaxNumberDao.updateByField(where, set);
    }

    /**
     * 通过主键修改实体列表，列表长度不能为0，
     * 注意：当实体属性为null时，对应的列也会别更新为null
     *
     * @param list<EMaxNumber> 对象列表
     * @return 影响行数
     */
    @Override
    public int updateBatch(List<EMaxNumber> list) {
        return list != null && !list.isEmpty() ? this.eMaxNumberDao.updateBatch(list) : 0;
    }

    /**
     * 通过主键删除数据
     *
     * @param numberId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(String numberId) {
        return this.eMaxNumberDao.deleteById(numberId) > 0;
    }

    /**
     * 通过实体非空属性删除
     *
     * @param eMaxNumber 条件实例对象
     * @return 影响行数
     */
    @Override
    public int deleteByEntity(EMaxNumber eMaxNumber) {
        return this.eMaxNumberDao.deleteByEntity(eMaxNumber);
    }

    /**
     * 通过多条主键删除多条数据
     *
     * @param list<String> 主键列表
     * @return 影响行数
     */
    @Override
    public int deleteByIds(List<String> list) {
        return list != null && !list.isEmpty() ? this.eMaxNumberDao.deleteByIds(list) : 0;
    }

    /**
     * 通过实体非空属性计数
     *
     * @param eMaxNumber 条件实例对象
     * @return 行数
     */
    @Override
    public int count(EMaxNumber eMaxNumber) {
        return this.eMaxNumberDao.count(eMaxNumber);
    }

    /**
     * 获取当着码单号，并更新
     * @param warehouseEname
     * @param weighTypeEname
     * @return
     */
    @Override
    public String getNumber(String warehouseEname, String weighTypeEname) {
        String number = null;

        EMaxNumber eMaxNumber = new EMaxNumber();
        if(StringUtils.isNotEmpty(warehouseEname)){
            eMaxNumber.setWarehouseEname(warehouseEname);
        }else {
            eMaxNumber.setWarehouseEname("G");
        }
        if(StringUtils.isNotEmpty(weighTypeEname)){
            eMaxNumber.setWeighTypeEname(weighTypeEname);
        }else {
            eMaxNumber.setWeighTypeEname("O");
        }
        List<EMaxNumber> maxNumberList = this.eMaxNumberDao.query(eMaxNumber);
        if(maxNumberList!=null && !maxNumberList.isEmpty()){
            eMaxNumber = maxNumberList.get(0);
            number = eMaxNumber.getWarehouseEname() + eMaxNumber.getWeighTypeEname()
                    + String.format("%09d", eMaxNumber.getNumber());

            //更新码单表
            eMaxNumber.setNumber(eMaxNumber.getNumber()+1);
            eMaxNumber.setModifyTime(new Date());
            this.eMaxNumberDao.update(eMaxNumber);
        }

        return number;
    }

}